<?php
/**
 * Created by PhpStorm.
 * User: CY
 * Date: 2018/3/2
 * Time: 14:13
 */

namespace app\lib\exception;

use Exception;
use think\exception\Handle;
use think\Log;
use think\Request;

class ExceptionHandler extends Handle
{
    private $code;
    private $msg;
    private $errorCode;

    /**
     * 重写Handle类的render方法，自定义异常处理
     * @param Exception $e
     * @return \think\Response|\think\response\Json
     */
    public function render(Exception $e) {
        if($e instanceof BaseException){
            // 如果是自定义异常，则控制http状态码，不需要记录日志
            // 因为这些通常是因为客户端传递参数错误或者是用户请求造成的异常
            $this->code = $e->code;
            $this->msg = $e->msg;
            $this->errorCode = $e->errorCode;
        }else{
            // 如果是服务器未处理的异常，将http状态码置为500，并记录日志
            if(config('app_debug')){
                // 调试状态下显示tp默认错误页面
                return parent::render($e);
            }else{
            }
            // 如果不是自定义的异常，需要记录日志
            $this->code = 500;
            $this->msg = 'sorry,we make a mistake.(^o^)Y';
            $this->errorCode = 999;
            $this->recordErrorLog($e);
        }

        // 需要返回给客户端当前请求的URL路径
        $request = Request::instance();
        $result = [
            'msg' => $this->msg,
            'error_code' => $this->errorCode,
            'request_url' => $request->url()
        ];
        return json($result,$this->code);
    }

    /**
     * 将异常写入日志
     * @param Exception $e
     */
    private function recordErrorLog(Exception $e){
        // 初始化日志
        Log::init([
            'type' => 'File',
            'path' => LOG_PATH,
            'level' => ['error']
        ]);
        Log::record($e->getMessage(),'error');
    }
}